


# ==================== 导入库 ====================
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats  # 导入scipy.stats并设置别名stats[1,2](@ref)
from ipywidgets import interact  # 交互式控件（若在Jupyter中使用）
import seaborn as sns  # 增强可视化效果

# ==================== 核心可视化函数 ====================
def plot_distributions():
    """绘制10种概率分布的对比图表"""
    plt.figure(figsize=(15, 20), dpi=100)
    
    # -------------------- 1. 均匀分布 --------------------
    plt.subplot(5, 2, 1)  # 创建5行2列的子图，位置1
    a, b = 0, 1
    # 生成均匀分布的PDF（概率密度函数）
    x_uniform = np.linspace(a-0.2, b+0.2, 100)
    y_uniform = stats.uniform.pdf(x_uniform, a, b-a)
    plt.plot(x_uniform, y_uniform, 'b-', lw=2, label='Continuous')
    # 添加离散均匀分布示例（骰子）
    outcomes = [1, 2, 3, 4, 5, 6]
    plt.bar(outcomes, [1/6]*6, alpha=0.5, label='Discrete')
    plt.title('Uniform Distribution', fontsize=12)
    plt.legend()
    
    # -------------------- 2. 正态分布 --------------------
    plt.subplot(5, 2, 2)
    mu, sigma = 0, 1
    # 生成±3σ范围的数据点
    x_norm = np.linspace(mu-3*sigma, mu+3*sigma, 100)
    y_norm = stats.norm.pdf(x_norm, mu, sigma)
    plt.plot(x_norm, y_norm, 'r-', lw=2)
    # 标记1σ区间（覆盖68%概率）
    plt.fill_between(x_norm, y_norm, where=(abs(x_norm-mu)<=sigma), 
                     alpha=0.3, color='red', label='1σ (68%)')
    plt.title(f'Normal Distribution ($\mu$={mu}, $\sigma$={sigma})', fontsize=12)
    
    # -------------------- 3. 二项分布 --------------------
    plt.subplot(5, 2, 3)
    n, p = 10, 0.5
    k_values = range(n+1)
    # 计算二项分布PMF（概率质量函数）
    pmf = [stats.binom.pmf(k, n, p) for k in k_values]
    plt.bar(k_values, pmf, edgecolor='black', alpha=0.7)
    plt.title(f'Binomial (n={n}, p={p})', fontsize=12)
    
    # -------------------- 4. 泊松分布 --------------------
    plt.subplot(5, 2, 4)
    lambda_ = 3
    k_values = range(0, 10)
    pmf_poisson = stats.poisson.pmf(k_values, lambda_)
    plt.bar(k_values, pmf_poisson, color='skyblue')
    # 标记理论峰值位置
    plt.axvline(lambda_, color='red', linestyle='--', alpha=0.5, label=f'Peak at λ={lambda_}')
    plt.title(f'Poisson Distribution (λ={lambda_})', fontsize=12)
    
    # -------------------- 5. 指数分布 --------------------
    plt.subplot(5, 2, 5)
    beta = 2.0
    x_exp = np.linspace(0, 10, 100)
    # 指数分布PDF（无记忆性）
    y_exp = stats.expon.pdf(x_exp, scale=beta)
    plt.plot(x_exp, y_exp, 'g-', lw=2)
    plt.title(f'Exponential Distribution (β={beta})', fontsize=12)
    
    # -------------------- 6. Gamma分布 --------------------
    plt.subplot(5, 2, 6)
    x_gamma = np.linspace(0, 10, 100)
    # 不同形状参数(k)对比
    params = [(1, 2), (2, 2), (3, 2)]  # (k形状, θ尺度)
    for k, theta in params:
        y_gamma = stats.gamma.pdf(x_gamma, k, scale=theta)
        plt.plot(x_gamma, y_gamma, label=f'k={k}, θ={theta}')
    plt.legend()
    plt.title('Gamma Distribution', fontsize=12)
    
    # -------------------- 7. Beta分布 --------------------
    plt.subplot(5, 2, 7)
    x_beta = np.linspace(0, 1, 100)
    # 不同α/β参数对比
    alpha_beta = [(0.5, 0.5), (2, 5), (5, 1)]
    for a, b in alpha_beta:
        y_beta = stats.beta.pdf(x_beta, a, b)
        plt.plot(x_beta, y_beta, label=f'α={a}, β={b}')
    plt.legend()
    plt.title('Beta Distribution', fontsize=12)
    
    # -------------------- 8. 卡方分布 --------------------
    plt.subplot(5, 2, 8)
    x_chi2 = np.linspace(0, 20, 100)
    # 不同自由度对比
    df_values = [2, 4, 6]
    for df in df_values:
        y_chi2 = stats.chi2.pdf(x_chi2, df)
        plt.plot(x_chi2, y_chi2, label=f'df={df}')
    plt.legend()
    plt.title('Chi-Square Distribution', fontsize=12)
    
    # -------------------- 9. F分布 --------------------
    plt.subplot(5, 2, 9)
    x_f = np.linspace(0.1, 5, 100)
    dfn, dfd = 5, 10  # 分子/分母自由度
    y_f = stats.f.pdf(x_f, dfn, dfd)
    plt.plot(x_f, y_f, 'm-', lw=2)
    plt.title(f'F Distribution (dfn={dfn}, dfd={dfd})', fontsize=12)
    
    # -------------------- 10. t分布 --------------------
    plt.subplot(5, 2, 10)
    x_t = np.linspace(-4, 4, 100)
    # 与正态分布对比
    y_norm_comp = stats.norm.pdf(x_t)
    y_t = stats.t.pdf(x_t, df=5)
    plt.plot(x_t, y_norm_comp, 'r--', label='Normal')
    plt.plot(x_t, y_t, 'b-', label='t (df=5)')
    plt.legend()
    plt.title("Student's t vs Normal", fontsize=12)

    # 调整布局并显示
    plt.tight_layout(pad=3.0)
    plt.suptitle('Probability Distributions Visualization', fontsize=16, y=0.99)
    plt.savefig('distributions_visualization.png', bbox_inches='tight')
    plt.show()     # 数据分析相关/others/Figure_1.png

# ==================== 交互式控件示例 ====================
def interactive_normal(mu=0, sigma=1):
    """动态调整正态分布参数（Jupyter中运行有效）[5](@ref)
    
    Args:
        mu (float): 均值参数
        sigma (float): 标准差参数
    """
    plt.figure(figsize=(8, 4))
    x = np.linspace(mu-4*sigma, mu+4*sigma, 200)
    y = stats.norm.pdf(x, mu, sigma)
    plt.plot(x, y, 'b-', lw=2)
    plt.fill_between(x, y, where=(abs(x-mu)<=sigma), alpha=0.3)
    plt.title(f'Normal Distribution ($\mu$={mu}, $\sigma$={sigma})')
    plt.grid(alpha=0.2)
    plt.show()     # 数据分析相关/others/Figure_2.png

# ==================== 主程序入口 ====================
if __name__ == "__main__":
    # 执行可视化函数
    plot_distributions()
    
    # 在支持交互的环境（如Jupyter）中启用控件
    try:
        interact(interactive_normal, mu=(-2.0, 2.0), sigma=(0.5, 2.0))
        print("交互式控件已启用")
    except Exception as e:
        print(f"交互模式未启用：{str(e)}")